想要改善这篇文章吗?提供此问题的详细答案,包括引文和答案正确的解释。答案不够详细的答案可能会被编辑或删除。 我错误地使用以下命令将文件添加到了Git: git添加myfile.txt 我还没有运行git commit。有一种方法可以撤消此操作,以便这些文件不会包含在提交中?
1个 2 下一个 您可以在提交之前撤消git add git reset <文件> 这会将其从当前索引(“即将提交”列表)中删除,而无需进行其他任何更改。 您可以使用 git重置 没有任何文件名可以取消所有应有的更改。当在合理的时间内有太多文件不能一一列出时,这可能会派上用场。 在旧版本的Git中,上述命令分别等效于git reset HEAD和git reset HEAD,如果HEAD未定义(因为尚未在存储库中进行任何提交)或模棱两可(因为创建了一个名为HEAD的分支,这是愚蠢的事情,您不应该这样做)。不过,在Git 1.8.2中已对此进行了更改,因此在现代版本的Git中,甚至可以在进行首次提交之前使用上述命令: “ git reset”(无选项或参数)用于在以下情况下出错 您的历史记录中没有任何提交,但是现在可以给您 空索引(为了匹配不存在的提交,您甚至都没有参与)。 文档:git reset | 你要: git rm --cached <添加文件到_撤消> 推理: 当我是新手时,我首先尝试 git reset。 (撤消我的整个初始添加),只是得到了此消息(不是这样)(有用): 致命:无法将“ HEAD”解析为有效的参考。 事实证明,这是因为HEAD ref(分支?)在第一次提交之后才存在。也就是说,如果您的工作流程(例如我的)类似于以下内容,您将遇到与我相同的初学者问题: cd到我伟大的新项目目录中,尝试Git,新热点 git初始化 git添加 git状态 ...很多废话 =>该死,我不想添加所有这些内容。 谷歌“撤消git添加” =>查找堆栈溢出-是 git reset。 =>致命:无法将“ HEAD”解析为有效的引用。 事实证明,在邮件列表中有一个针对此问题的日志记录了一个错误。 而且正确的解决方案就在Git状态输出中(是的,我掩饰为“废话”) ... #要提交的更改: #(使用“ git rm --cached <文件> ...”取消登台) ... 解决方案的确是使用git rm --cached FILE。 注意此处其他地方的警告-git rm删除文件的本地工作副本,但如果使用--cached则不会删除。这是git help rm的结果: -缓存 使用此选项可以取消登台并仅从索引中删除路径。 无论是否修改,都会保留工作树文件。 我继续使用 git rm-缓存 删除所有内容,然后重新开始。不过没有用,因为在添加时。是递归的,结果表明rm需要-r来递归。叹。 git rm -r --cached。 好的,现在我回到了起点。下次,我将使用-n进行空运行并查看将添加的内容: git add -n 在信任git help rm关于--cached不会破坏任何内容(以及如果我拼错的内容怎么办)之前,我将所有内容压缩到一个安全的地方。 | 如果输入: git状态 Git会告诉您已登台的内容等,包括有关如何登台的说明: 使用“ git reset HEAD <文件> ...”取消登台 我发现Git在这种情况下勉强我做正确的事情做得很好。 注意:最新的Git版本(1.8.4.x)更改了此消息: (使用“ git rm --cached <文件> ...”取消登台) | 需要说明的是:git add将更改从当前工作目录移动到暂存区(索引)。 此过程称为暂存。因此,进行更改(更改文件)的最自然的命令是显而易见的命令: git阶段 git add只是git stage易于使用的别名 可惜没有git unstage或git unadd命令。相关的难以猜测或记住,但很明显: git reset HEAD- 我们可以轻松为此创建一个别名: git config --global alias.unadd'重置头-' git config --global alias.unstage'重置头-' 最后,我们有了新命令: git添加文件1 git stage file2 git unadd file2 git unstage file1 我个人使用更短的别名: git a#用于暂存 git u#用于暂存 | 除了已接受的答案之外,如果错误添加的文件很大,您可能会注意到,即使使用'git reset'将其从索引中删除后,它似乎仍然占据.git目录中的空间。 这没什么好担心的。该文件确实仍在存储库中,但仅作为“松散对象”。不会将其复制到其他存储库(通过克隆,推送),最终将回收该空间-尽管可能不会很快。如果您着急,可以运行: git gc --prune =现在 更新(以下是我尝试清除最受好评的答案可能引起的一些混淆): 那么,哪个是git add的真正撤消? git reset HEAD <文件> 要么 git rm --cached <文件>? 严格来说,如果我没记错的话:没有。 git add无法撤消-通常来说是安全的。 让我们首先回顾一下git add 的实际作用: 如果以前未跟踪 ,则git add将其添加到缓存及其当前内容。 如果已经跟踪了 ,则git add将当前内容(快照,版本)保存到缓存中。在Git中,此操作仍称为添加(而不只是更新),因为文件的两个不同版本(快照)被视为两个不同的项目:因此,我们的确是向缓存中添加了一个新项目,最终以后提交。 鉴于此,这个问题有点模棱两可: 我错误地使用命令添加了文件... OP的场景似乎是第一个(未跟踪的文件),我们希望“撤消”从跟踪的项目中删除文件(而不仅仅是当前内容)。如果是这种情况,那么可以运行git rm --cached 。 我们还可以运行git reset HEAD 。通常,这是可取的,因为它在两种情况下都有效:当我们错误地添加已经跟踪的项目的版本时,它也会撤消操作。 但是有两个警告。 第一:(在答案中指出)只有一种情况,其中git reset HEAD不起作用,但是git rm --cached起作用:新的存储库(无提交)。但是,实际上,这实际上是无关紧要的情况。 其次:请注意git reset HEAD不能神奇地恢复以前缓存的文件内容,它只是与HEAD重新同步。如果我们误导的git add覆盖了先前暂存的未提交版本,我们将无法恢复它。因此,严格来说,这是我们不能撤消[*]的原因。 例: $ git init $ echo“版本1”> file.txt $ git add file.txt#第一次添加file.txt $ git commit -m'第一次提交' $ echo“版本2”> file.txt $ git add file.txt#阶段(不要提交)file.txt的“版本2” $ git diff --cached file.txt 版本1 +版本2 $ echo“版本3”> file.txt $ git diff file.txt 版本2 +版本3 $ git add file.txt#糟糕,我们不是这个意思 $ git reset HEAD file.txt#撤消吗? $ git diff --cached file.txt#当然没有dif。阶段== HEAD $ git diff file.txt#我们不可挽回地丢失了“版本2” 版本1 +版本3 当然,如果仅遵循通常的懒惰工作流(仅用于添加新文件)进行“ git add”(案例1),然后通过commit git commit -a命令更新新内容,这并不是很关键。 *(编辑:以上内容实际上是正确的,但仍可能有一些稍微有些杂乱/令人费解的方法来恢复已上演但未提交但随后被覆盖的更改-请参阅Johannes Matokic和iolsmit的评论) | 使用Git撤消已经添加的文件非常容易。要重置已添加的myfile.txt,请使用: git reset HEAD myfile.txt 说明: 暂存不需要的文件后,要撤消,可以执行git reset。 Head是本地文件的头,最后一个参数是文件名。 我已为您在下图中创建了更详细的步骤,包括在这些情况下可能发生的所有步骤: | git rm-缓存-r 将递归“取消添加”从当前目录添加的所有内容 | 跑 git gui 并手动删除所有文件,或选择所有文件并单击“从提交取消登台”按钮。 | 这个问题没有明确提出。原因是git add有两个含义: 向暂存区添加一个新文件,然后使用git rm --cached文件撤消。 将一个修改过的文件添加到暂存区,然后使用git reset HEAD文件撤消。 如有疑问,请使用 git reset HEAD文件 因为在两种情况下都可以完成预期的操作。 警告:如果您对修改过的文件(仓库中以前存在的文件)执行git rm --cached文件,则在git commit时将删除该文件!它仍将存在于您的文件系统中,但是如果其他人拉您的提交,该文件将从他们的工作树中删除。 git status会告诉您该文件是新文件还是已修改的文件: 在分支机构主管 所做更改: (使用“ git reset HEAD <文件> ...”取消登台) 新文件:my_new_file.txt 已修改:my_modified_file.txt | Git有可以想象到的每个动作的命令,但它需要广泛的知识来使事情正确,因此,它充其量是违反直觉的…… 您之前做了什么: 更改了文件并使用git add。或git add <文件>。 你想要什么: 从索引中删除文件,但保持版本化,并保留工作副本中未提交的更改: git reset HEAD <文件> 将文件重置为HEAD的最后一个状态,撤消更改并将其从索引中删除: #认为`svn revert `IIRC。 git reset HEAD <文件> git checkout <文件> #如果您有一个名为 的` `,请使用: git checkout-<文件> 这是必需的,因为git reset --hard HEAD不适用于单个文件。 从索引和版本控制中删除 ,保留未版本化的文件以及工作副本中的更改: git rm-缓存<文件> 从工作副本和版本中完全删除 : git rm <文件> | 如果您正在进行初次提交,则不能使用git重置,只需声明“ Git破产”并删除.git文件夹并重新开始 | 根据许多其他答案,您可以使用git reset 但: 我发现了这篇很棒的小文章,实际上为git unadd添加了Git命令(还有一个别名):有关详细信息,请参见git unadd。 只是, git config --global alias.unadd“重置头” 现在你可以 git unadd foo.txt bar.txt | 使用git add -i从您即将提交的提交中删除刚添加的文件。例: 添加您不想要的文件: $ git add foo $ git状态 #在分支主管上 #要提交的更改: #(使用“ git reset HEAD <文件> ...”取消登台) # #新文件:foo # #未跟踪的文件: #(使用“ git add <文件> ...”包含在将提交的内容中) #[...]# 进入交互式添加以撤消添加(在git此处键入的命令是“ r”(还原),“ 1”(列表还原中的第一项显示),“返回”以退出还原模式和“ q” (放弃): $ git add -i 分阶段未分阶段的路径 1:+ 1 / -0没什么foo ***命令*** 1:[状态] 2:[正常] 3:[逆转] 4:[a] dd未跟踪 5:[p]补6:[d] iff 7:[q] uit 8:[h] elp 现在怎么办 分阶段未分阶段的路径 1:+ 1 / -0无[f] oo 还原>> 1 分阶段未分阶段的路径 * 1:+ 1 / -0无[f] oo 还原>> 注意:foo现在未被跟踪。 恢复一条路 ***命令*** 1:[状态] 2:[结束] 3:[逆转] 4:[a] dd未跟踪 5:[p]补6:[d] iff 7:[q] uit 8:[h] elp 现在怎么办 再见 $ 而已!这是您的证明,表明“ foo”又回到了未跟踪列表中: $ git状态 #在分支主管上 #未跟踪的文件: #(使用“ git add <文件> ...”包含在将提交的内容中) #[...] #foo 没有添加任何内容提交但存在未跟踪的文件(使用“ git add”进行跟踪) $ | 可以使用git remove或git rm-带有--cached标志。尝试: git help rm | 当您开始一个新项目时,这是避免这种烦人问题的一种方法: 为新项目创建主目录。 运行git init。 现在创建一个.gitignore文件(即使它是空的)。 提交您的.gitignore文件。 如果您没有任何提交,Git会使执行git reset变得非常困难。如果您只是为了拥有一个而创建一个微小的初始提交,那么您可以根据需要进行git add -A和git reset多次,以使所有操作正确。 此方法的另一个优点是,如果以后遇到行尾麻烦并且需要刷新所有文件,则很容易: 签出该初始提交。这将删除您的所有文件。 然后再次检查您最近的提交。这将使用您当前的行尾设置来检索文件的新副本。 | 自您发布问题以来,也许Git已经发展。 $> git --version git版本1.6.2.1 现在,您可以尝试: git reset HEAD。 这应该是您想要的。 | 请注意,如果您未能指定修订版本,则必须包含分隔符。我的控制台示例: git reset <文件路径> 致命:参数“ ”不明确:修订版本或路径不在工作树中。 使用“-”将路径与修订分开 git reset-<文件路径> 重置后的未分级更改: M <文件路径> (Git版本1.7.5.4) | 如上所述,要从登台区域删除新文件(并且仅在新文件的情况下): git rm-缓存的文件 rm --cached仅用于意外添加的新文件。 | 要重置特定文件夹(及其子文件夹)中的每个文件,可以使用以下命令: git reset * | 使用*命令一次处理多个文件: git reset HEAD * .prj git reset HEAD * .bmp git reset HEAD * gdb * 等等 | 只需输入git reset,它就会还原,就像您从未输入git add一样。自上次提交以来。确保您之前已作出承诺。 | 假设我创建一个新文件newFile.txt: 假设我不小心添加了文件,git add newFile.txt: 现在我要撤消此添加,在提交之前,git reset newFile.txt: | 对于特定文件: git reset my_file.txt git checkout my_file.txt 对于所有添加的文件: git reset。 git checkout。 注意:检出会更改文件中的代码,并移至最后更新(提交)状态。重置不会更改代码;它只是重置标题。 | 要撤消git add,请使用: git reset文件名 | 此命令将取消存储您的更改: git reset HEAD filename.txt文件 您也可以使用 git添加-p 添加文件的一部分。 | 还有交互模式: git添加-i 选择选项3取消添加文件。就我而言,我经常想添加多个文件,并且在交互模式下,您可以使用像这样的数字来添加文件。除了4:1、2、3和5外,这将占用所有其他内容 要选择一个序列,只需输入1-5即可将1取为5。 Git暂存文件 | git add myfile.txt#这会将您的文件添加到待提交列表中 与该命令完全相反的是, git reset HEAD myfile.txt#这将撤消它。 因此,您将处于以前的状态。指定将再次出现在未跟踪列表中(以前的状态)。 它将使用该指定文件重置您的头部。因此,如果您的头没有它的意思,它将简单地将其重置。 | git reset filename.txt 将从当前索引“即将提交”区域中删除一个名为filename.txt的文件,而不进行其他任何更改。 | git reset filename.txt 将从当前索引的“即将提交”区域中删除一个名为filename.txt的文件,而不进行任何其他更改。 | 在Sourcetree中,您可以通过GUI轻松完成此操作。 您可以检查Sourcetree用于取消暂存文件的命令。 我创建了一个新文件并将其添加到Git。然后,我使用Sourcetree GUI取消登台。 结果如下: 正在取消暂存文件[15/12/15 10:43] git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = sourcetree reset -q-路径/到/文件/文件名.java Sourcetree使用reset取消登台新文件。 | 1个 2 下一个 高度活跃的问题。赢得10个声誉才能回答这个问题。信誉要求有助于保护该问题免受垃圾邮件和非答复活动的侵害。 不是您要找的答案?浏览其他标记为git version-control git-commit git-stage的问题,或询问您自己的问题。